package com.cwnu.sw.cys.core.user.domain.entity;

import lombok.*;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.Objects;
import java.util.Optional;
/**
 * IP 信息实体类，用于存储和操作与IP相关的数据。
 *
 * <p>包括创建IP、更新IP及其详细信息的管理功能。</p>
 *
 * @author jisam
 * @version 1.0
 * @contact "jisamchan@outlook.com"
 * @date 01/04/2025
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class IpInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 创建IP地址
     */
    private String createIp;

    /**
     * 创建IP的详细信息
     */
    private IpDetail createIpDetail;

    /**
     * 更新IP地址
     */
    private String updateIp;

    /**
     * 更新IP的详细信息
     */
    private IpDetail updateIpDetail;

    /**
     * 刷新IP地址信息。
     *
     * @param attr 新的IP地址
     */
    public void refresh(String attr) {
        if (StringUtils.isBlank(attr)) {
            return;
        }
        if (StringUtils.isBlank(createIp)) {
            createIp = attr;
        } else {
            updateIp = attr;
        }
    }

    /**
     * 判断是否需要刷新更新IP的详细信息。
     *
     * @return 需要刷新的IP地址，如果不需要刷新则返回null
     */
    public String needRefreshIp() {
        boolean notNeedRefresh = Optional.ofNullable(updateIpDetail)
                .map(IpDetail::getIp)
                .filter(ip -> Objects.equals(ip, updateIp))
                .isPresent();
        return notNeedRefresh ? null : updateIp;
    }

    /**
     * 刷新IP详细信息。
     *
     * @param ipDetail 新的IP详细信息
     */
    public void refresh(IpDetail ipDetail) {
        if (Objects.equals(createIp, ipDetail.getIp())) {
            createIpDetail = ipDetail;
        }
        if (Objects.equals(updateIp, ipDetail.getIp())) {
            updateIpDetail = ipDetail;
        }
    }
}
